package com.sleep.blog.utils;

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Objects;

/**
 * @author Sleep-6000
 * @date 2021/10/7
 */
public class HttpContextUtils {

    /**
     * http 上下文
     * 想在 Service 方法中使用 HttpServletRequest 的 API ，
     * 但是又不想把 HttpServletRequest 对象当作这个 Service 方法的参数传过来
     * 在 SpringMVC 中就有开箱即用的实现。
     * 代码是：((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()
     * 原理：在请求执行之前获取到 HttpServletRequest ，把它 set() 到某个类的 ThreadLocal 类型的静态成员中，
     * 使用的时候直接通过静态方式访问到这个 ThreadLocal 对象，
     * 调用它的 get() 方法，即可获取到线程隔离的 HttpServletRequest 了。
     * 最后，在请求结束后，要调用 ThreadLocal 的 remove() 方法，清理资源引用。 ——线程隔离
     */
    public static HttpServletRequest getHttpServletRequest(){
        return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
    }
}
